﻿#define  _CRT_SECURE_NO_WARNINGS 1
#include <stdio.h>
//int main()
//{
//	////数组的初始化
	//int arr1[10] = { 0 };//设定十个元素，初始化第一个元素为0，后续自动填充为0
	//int arr2[] = { 0 };//初始化未设定元素个数，由编译器自动确定元素个数，故该数组只有一个元素
	//int arr3[20] = { 1,2,3,4,5,6,7,8,9,10 };//不完全初始化，前十个已设定，后十个自动填充为0

	//int data[3][5];
	//float scare[5][30];
	//int sz1 = sizeof(data) / sizeof(data[0][0]);
	//int sz2 = sizeof(scare) / sizeof(scare[0][0]);
	//int i = 0;
	//int j = 0;
	//for(i = 0;i)
//
//	int data1[3][5] = { 1,2,3,4,5,6,7,8,9 };
//	int data2[3][5] = { 0 };
//	int data3[3][5] = {1,2,3,4,5,2,3,4,5,6,3,4,5,6,7};
//	int data4[3][5] = { {1,2}, {2,3 }, {3,4} };
////	return 0;
////}
//	int main()
//	{
//		int arr[][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
//		printf("%d ", arr[0][1]);
//		printf("%d ", arr[2][4]);
//		return 0;
//	}
////创建数组，输入每个每个元素，并打印
//int main()
//{
//	int arr[3][5] = { 0 };
//	//输入
//	int i = 0;
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			scanf("%d", &arr[i][j]);
//		}
//	}
//	//打印元素
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			printf("%d ", arr[i][j]);
//		}
//		printf("\n");
//	}
//	return 0;
//}

//二维数组在内存中的存储
//int main()
//{
//	int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
//	int i = 0;
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			printf("arr[%d][%d]=%p\n", i,j, &arr[i][j]);
//		}
//	}
//	return 0;
//}
//打印二维数组
//int main()
//{
//	int arr[3][5] = { 1,2,3,4,5,2,3,4,5,6,3,4,5,6,7 };
//	int i = 0;
//	for (i = 0; i < 3; i++)
//	{
//		int j = 0;
//		for (j = 0; j < 5; j++)
//		{
//			printf("arr[%d][%d]=%d\n", i, j, arr[i][j]);
//		}
//	}
//	return 0;
//}

//int main()
//{
//	int arr[10];
//	int n = 10;
//	int arr1 = [n];//error
//	return 0;
//}

//C99变长数组，即通过输入变量来确定数组的长度
//int main()
//{
//	int n = 0;
//	scanf("%d", &n);
//	int arr[n] = { 0 };
//	int i = 0;
//	for (i = 0; i < n; i++)
//	{
//		printf("%d ", arr[i]);
//	}
//
//	return 0;
//}

//多个字符从两端移动，向中间汇聚、
//#include <string.h>
//#include <windows.h>
//int main()
//{
//	char arr1[] = "Hello World!!!!!!!";
//	char arr2[] = "******************";
//	int L1 = strlen(arr1)-1;
//	int left = 0;
//	int right = L1;
//	while (left <=right)
//	{
//		//printf("%s\n", arr2);
//		arr2[left] = arr1[left];
//		arr2[right] = arr1[right];
//
//		printf("%s\n", arr2);
//		Sleep(1000);
//		system("cls");
//		left++;
//		right--;
//
//	}
//	printf("%s\n", arr2);
//	return 0;
//
// 
// 
// }

//多个字符从两端移动，向中间汇聚
//#include <string.h>
//#include <windows.h>
//int main()
//{
//	//创建两个数组
//	char arr1[] = "Hello World!!!!!!!!!";
//	char arr2[] = "********************";
//	//怎么达到移动的要求呢？就得让字符从左右两边同时进行替换
//	int left = 0;
//	int right = strlen(arr1) - 1;//字符串以终止符结尾，所以减一表示字符串最后一个，注意使用对应头文件
//	//需要重复进行替换所以要用到循环语句
//	printf("%s\n", arr2);
//	Sleep(1000);
//	system("cls");
//	while (left<=right)
//		//在什么时候要停止循环呢？两种情况，一种是左右处于同一位置，打印后就不用再进行；另一种是直接左超过右，即左大于右
//	{
//		//让两个数组左右进行替换
//		arr2[left] = arr1[left];
//		arr2[right] = arr1[right];
//		//替换后进行打印。显示效果
//		printf("%s\n", arr2);
//		//要到达更好的效果就要暂缓时间，且清除之前打印东西
//		Sleep(1000);//对应头文件
//		system("cls");//最后一次循环把所有东西都清除了，所以需要在最后打印一次，且不能放在循环当中
//		//之后让光标分别左右移动
//		left++;
//		right--;
//
//	}
//	printf("%s\n", arr2);
//
//	return 0;
//
//}
//

//
////⼆分查找：1 2 3 4 5 6 7 8 9 10
////          0 1 2 3 4 5 6 7 8 9  输入一个值。找到这个值在数组中的位置
//int main()
//{
//	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
//	int i = 0;
//	scanf("%d", &i);
//	int left = 0;
//	int right = sizeof(arr) / sizeof(arr[0]) - 1;
//	int key = 0;
//
//	while (left<=right)
//	{
//		int mid = (right + left) / 2;
//
//		key = arr[mid];
//			if (key > i)
//			{
//				right = mid - 1;
//			}
//			else if(key < i)
//			{
//				left = mid + 1;
//
//			}
//		if(key == i)
//		{
//			printf("找到了，%d的下标是%d", i, mid);
//			break;
//		}
//
//
//	}
//
//	return 0;
//
//}
//二分查找：对于一组数字，输入一个数，进行匹配，并找到这个数在数组中的位置
//注意：只能用于有顺序的一组数字
//
int main()
{
	//创建数组
	int arr[] = { 1,2,3,4,5,6,7,8,9,10 };
	//            0 1 2 3 4 5 6 7 8  9
	//输入数字
	int i = 0;
	scanf("%d", &i);
	//二分总得取平均，所以得确定元素个数
	int left = 0;
	int right = sizeof(arr) / sizeof(arr[0]) - 1;//利用数组下标找数字，所以要对应下标
	while (left <= right)//当左右已经互换位置时，无法再找到了
	{
		int mid = (left + right) / 2;//确定下标
		int num = arr[mid];
		if (num > i)
		{
			right = mid - 1;//输入的小，就得将右边中值下标往左移
		}
		else if (num  < i)
		{
			left = mid + 1;//输入的大，就得将左边中值下标往右移
		}
		else
		{
			printf("找到啦，%d的下标是%d\n", i, mid);
			break;
		}
	}
	if (left > right)
	{
		printf("找不到了，换个数字吧\n");
	}


	return 0;
}